home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / ghostrid.lha / GhostRider / Loader / GRLoader.s
Text File  |  1995-08-28  |  13KB  |  621 lines

  1. ;---------------T-------T---------------T------------------------------------T
  2. ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  3. ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  4. ; This source is © Copyright 1992-1995, Jesper Skov.
  5. ; Read "GhostRiderSource.ReadMe" for a description of what you may do with
  6. ; this source!
  7. ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  8. ; Please do not abuse! Thanks. Jesper
  9. ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  10. ;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  11. ;-----------------------------------------------------------------------------;
  12. ;- Program Title    : GhostRider Loader    -;
  13. ;- Copyrigth Status    : PD, (c) Copyrigth Jesper Skov    -;
  14. ;- Programmed by    : Jesper Skov        -;
  15. ;- Version.Revision    : 38.7
  16. ;- Project start    : 05.11.93        -;
  17. ;-----------------------------------------------------------------------------;
  18. ;- Program Description    :        -;
  19. ;-----------------------------------------------------------------------------;
  20. ;-                Program History    -;
  21. ;-----------------------------------------------------------------------------;
  22. ;-----------------------------------------------------------------------------;
  23. ;210194.0015    Added $f00000 load handling.
  24. ;310194.0016    Added default path/file and revision# check.
  25. ;      .0017    Removed Config-name ARG. Always default now.
  26. ;      .0019    Added KeyMap Load.
  27. ;010294.0020.6    Added COLD ARG. Calls COLD/COOL init-routine if found.
  28. ;      .0021    Better output in case of wrong syntax.
  29. ;040294.0022    Added 'USER'-mark to signal GR of loaded prefs.
  30. ;060294.0023    Cache was not cleared after Reloc-table load. Fixed
  31. ;170494.0024    No need for ^. Removed. Added entry call to set_port
  32. ;140894.0029.9    Added 2-hunk loading, STATIC and CHIP specifiers.
  33. ;290894.0030.10    6 bytes of pref was not loaded. Fixed.
  34. ;080994.0031.11    Changed default pref path to S:
  35.  
  36. VERSTRING    macro
  37.     dc.b    '.11 (08.09.94)'
  38.     endm
  39.  
  40. ip_SetPort=    3
  41.  
  42.     IncDir    Include:
  43.     include    dos/rdargs.i
  44.  
  45.                 include libraryOffsets/exec_lib.i
  46.                 include exec/execbase.i
  47.                 include exec/exec.i
  48.  
  49.                 include libraryOffsets/dos_lib.i
  50.                 include dos/dos.i
  51.                 include dos/dosextens.i
  52.  
  53. CallE           MACRO
  54.                 MOVE.L  $4.W,A6
  55.                 JSR     _LVO\1(A6)
  56.                 ENDM
  57.  
  58. CallD           MACRO
  59.                 MOVE.L  _DOSBase(b),A6
  60.                 JSR     _LVO\1(A6)
  61.                 ENDM
  62.  
  63. Call            macro
  64.                 jsr     _LVO\1(a6)
  65.                 endm
  66.  
  67.     jumpptr    s
  68.  
  69. b    equr    a5
  70.  
  71. s    lea    B,b    ;open DOS
  72.     lea    DOSNam(pc),a1
  73.     moveq    #37,d0
  74.     CallE    OpenLibrary
  75.     move.l    d0,_DOSBase(b)
  76.     beq.w    DOSTooOld
  77.  
  78.     move.l    #Template,d1    ;get ARGs parsed
  79.     lea    ArgArray(b),a0
  80.     move.l    a0,d2
  81.     moveq    #0,d3
  82.     CallD    ReadArgs
  83.     move.l    d0,_RDArgs(b)
  84.     beq.w    NoArguments
  85.  
  86.     move.l    AbsAddr(b),d0    ;parse string to hexadecimal integer
  87.     beq.b    .NoAbsAddress
  88.     move.l    d0,a0
  89.  
  90.     bsr.w    GetHexValue
  91.  
  92.     lea    $f00000,a0
  93.     cmp.l    a0,d0    ;GB memory?
  94.     bne.b    .GBMem
  95.     move.l    #$11114EF9,(a0)+
  96.     move.l    #$00F00000,(a0)+
  97.     move.l    a0,d0    ;corrected address
  98.     st.b    Force(b)    ;always force
  99.     st.b    FindRST(b)    ;flag that RST should be found
  100.  
  101. .GBMem    move.l    d0,CodeAddress(b)
  102.  
  103. .NoAbsAddress    move.l    ChipAddr(b),d0
  104.     beq.b    .NoChipAddress
  105.     move.l    d0,a0
  106.  
  107.     bsr.w    GetHexValue
  108.  
  109.     move.l    d0,ChipAddress(b)
  110.  
  111. .NoChipAddress    move.l    FileName(b),a0    ;get filename
  112.     move.l    a0,d1
  113.     beq.w    NoFilename
  114.     move.l    #MODE_OLDFILE,d2;and open file
  115.     Call    Open
  116.     move.l    d0,_FileHandle(b)
  117.     beq.w    FileNotOpened
  118.  
  119.     move.l    d0,d1    ;get first $24 bytes
  120.     lea    TrashBuffer(b),a0;including the hunklengths ($14/$18)
  121.     move.l    a0,d2
  122.     moveq    #$24,d3
  123.     Call    Read
  124.     cmp.l    #$24,d0
  125.     bne.w    ReadError
  126.  
  127.     move.l    CodeAddress(b),d1;Get mem for CODE
  128.     move.l    TrashBuffer+$14(b),d0
  129.     asl.l    #2,d0    ;convert to longs
  130.     move.l    d0,d6
  131.     moveq    #0,d2
  132.     bsr.w    GetMemAllocated
  133.     move.l    d0,CodeAddress(b)
  134.     add.l    d0,d6
  135.     move.l    d6,CodeAddressEnd(b)
  136.  
  137.     move.l    #MEMF_CLEAR,d2;if not abs address specified
  138.     moveq    #0,d1    ;if swap mem, don't alloc
  139.     tst.l    Static(b)
  140.     beq.b    .NotStatic
  141.  
  142.     move.l    ChipAddress(b),d1;Get mem for DATA
  143.     or.l    #MEMF_CHIP,d2    ;if not abs address specified
  144.             ;go for address in chip
  145. .NotStatic    move.l    TrashBuffer+$18(b),d0
  146.     and.l    #$fffff,d0    ;get rid of ChipLoad hunk ID
  147.     asl.l    #2,d0    ;convert to longs
  148.     move.l    d0,d6
  149.     bsr.w    GetMemAllocated
  150.     move.l    d0,DataAddress(b)
  151.     add.l    d0,d6
  152.     move.l    d6,DataAddressEnd(b)
  153.  
  154.     move.l    CodeAddress(b),d2
  155.     move.l    CodeAddressEnd(b),d3
  156.     sub.l    d2,d3
  157.     move.l    _FileHandle(b),d1
  158.     CallD    Read    ;read the code
  159.     cmp.l    d3,d0
  160.     bne.w    ReadError
  161.  
  162.     move.l    _FileHandle(b),d1;get first 12 bytes
  163.     lea    TrashBuffer(b),a0;including the reloc hunklength (4)
  164.     move.l    a0,d2
  165.     moveq    #12,d3
  166.     Call    Read
  167.     moveq    #12,d1
  168.     cmp.l    d1,d0
  169.     bne.w    ReadError
  170.  
  171.     move.l    TrashBuffer+4(b),d0;alloc space for reloc hunk
  172.     addq.l    #7,d0    ;AND space for the next hunk info (CHIP)
  173.     asl.l    #2,d0
  174.     move.l    d0,RelocLen(b)
  175.     moveq    #0,d1
  176.     CallE    AllocMem
  177.     move.l    d0,RelocMem(b)    ;read alloc hunk
  178.     beq.w    AllocError
  179.  
  180.     move.l    d0,d2
  181.     move.l    RelocLen(b),d3
  182.     move.l    _FileHandle(b),d1
  183.     CallD    Read
  184.     cmp.l    RelocLen(b),d0
  185.     bne.w    ReadError
  186.  
  187.     move.l    RelocMem(b),a0    ;relocate program
  188.     move.l    CodeAddress(b),a1
  189.     move.l    a1,d0
  190.     move.l    TrashBuffer+4(b),d1
  191. .RelocLoop    move.l    (a0)+,d2
  192.     add.l    d0,(a1,d2.l)
  193.     subq.l    #1,d1
  194.     bne.b    .RelocLoop
  195.  
  196.     addq.l    #8,a0    ;skip two 1.l s
  197.     move.l    DataAddress(b),d2
  198.     move.l    (a0)+,d0
  199.     move.l    4(a1,d0.l),a1    ;get hold of ChipMem and ChipBackup
  200.  
  201.     move.l    ChipAddress(b),(a1);set specified CHIP (may be NULL)
  202.  
  203.     tst.l    Static(b)
  204.     bne.w    .Static
  205.     addq.w    #4,a1    ;if dynamic set load address in ChipBackup
  206.  
  207. .Static    move.l    d2,(a1)
  208.  
  209.     move.l    $c(a0),d3    ;get longword length
  210.     asl.l    #2,d3
  211.     move.l    _FileHandle(b),d1
  212.     Call    Read    ;and read DATA to memory
  213.     cmp.l    d3,d0    ;check OK load length
  214.     bne.w    ReadError
  215.  
  216.     tst.b    FindRST(b)
  217.     beq.b    .notF00000
  218.     move.l    #'RST!',d0
  219.     bsr.w    ScanGRID
  220.     bne.b    .foundRST
  221.     clr.w    $f00000    ;kill, RST not found!
  222.     bra.b    .notF00000
  223.  
  224. .foundRST    move.l    d0,$f00004    ;store RST entry address
  225.  
  226. .notF00000    tst.l    SetNMI(b)    ;set NMI-vector
  227.     beq.b    .noNMI
  228.     move.l    #'NMI!',d0    ;find NMI-entry address
  229.     bsr.w    ScanGRID
  230.     move.l    d0,d7
  231.  
  232.     sub.l    a0,a0    ;defaultVBR=0
  233.     move.l    $4.w,a6
  234.     btst    #0,AttnFlags+1(a6);'010+?
  235.     beq.b    .MC68000
  236.     lea    .GetVBR(pc),a5;yes, get VBR
  237.     Call    Supervisor
  238.     lea    B,b
  239. .MC68000    move.l    d7,$7c(a0)
  240.     bra.b    .noNMI
  241.  
  242. .GetVBR    movec    vbr,a0
  243.     rte
  244.  
  245. .noNMI    tst.l    Cold(b)
  246.     beq.w    .noCold
  247.     move.l    #'CLD!',d0
  248.     bsr.w    ScanGRID
  249.     beq.b    .noCold    ;ID was not found
  250.     move.l    d0,a0
  251.     jsr    (a0)    ;get Cold/Cool set
  252.     lea    B,b
  253.  
  254. .noCold    move.l    #'GRIP',d0
  255.     bsr.w    ScanGRID
  256.     beq.b    .noIP
  257.     move.l    d0,a0
  258. .scanMsgPort    move.w    (a0),d0
  259.     bmi.b    .noIP
  260.     addq.w    #6,a0
  261.     cmp.w    #ip_SetPort,d0
  262.     bne.b    .scanMsgPort
  263.     move.l    -(a0),a0
  264.     jsr    (a0)
  265. .noIP
  266.  
  267. Exit    move.l    RelocMem(b),a1    ;free relocmem
  268.     move.l    a1,d0
  269.     beq.b    .nomem
  270.     move.l    RelocLen(b),d0
  271.     CallE    FreeMem
  272.     clr.l    RelocMem(b)
  273. .nomem
  274.     move.l    _FileHandle(b),d1
  275.     beq.b    .nofile
  276.     CallD    Close
  277.     clr.l    _FileHandle(b)
  278. .nofile
  279.     tst.b    Error(b)
  280.     bne.b    .dead
  281.     bsr.w    ReadConfig
  282. .dead
  283.     move.l    _RDArgs(b),d1
  284.     beq.b    CloseDOSLib
  285.     CallD    FreeArgs
  286.     clr.l    _RDArgs(b)
  287.  
  288. CloseDOSLib    move.l    _DOSBase(b),a1
  289.     CallE    CloseLibrary
  290.  
  291.     Call    CacheClearU
  292.  
  293.     tst.l    Quiet(b)
  294.     bne.b    .QuietExit
  295.     tst.b    Error(b)
  296.     bne.b    .QuietExit
  297.     move.l    CodeAddress(b),a0
  298.     jmp    4(a0)    ;enter mon if not quiet and no errors
  299.             ;4 because of two other bras.
  300.  
  301. .QuietExit    moveq    #0,d0
  302.     rts
  303.  
  304. NoFilename    lea    NoFileNameText(pc),a0
  305.     bra.b    PrintError
  306.  
  307. AllocErrorP    addq.w    #4,a7    ;quit caller
  308. AllocError    lea    AllocErrorText(pc),a0
  309.     bra.b    PrintError
  310.  
  311. ReadError    lea    ReadErrorText(pc),a0
  312.     bra.b    PrintError
  313.  
  314. HexError    addq.w    #4,a7    ;quit caller
  315.     lea    HexErrorText(pc),a0
  316.     bra.b    PrintError
  317.  
  318. FileNotOpened    lea    OpenErrorText(pc),a0
  319.     bra.b    PrintError
  320.  
  321. NoArguments    lea    InfoText(pc),a0
  322.     bsr.b    ShowError
  323.     lea    Usage(pc),a0
  324.     bsr.b    ShowError
  325.     lea    LineFeed(pc),a0
  326. ;    bra.w    PrintError
  327.  
  328. PrintError    st.b    Error(b)
  329.     pea    Exit(pc)
  330. ShowError    move.l    a0,-(a7)
  331.     CallD    Output
  332.     move.l    d0,d1
  333.     move.l    (a7)+,a0
  334.     moveq    #0,d3
  335.     move.b    (a0)+,d3
  336.     move.l    a0,d2
  337.     Call    Write
  338.     rts
  339.  
  340.  
  341. DOSTooOld    moveq    #1,d0
  342.     rts
  343.  
  344. ;---- Conve    rt ASCII string to HEX value (a0 - string)
  345. GetHexValue    moveq    #0,d0
  346. .parsehexaddr    move.b    (a0)+,d1
  347.     beq.b    .addrend
  348.     cmp.b    #'0',d1
  349.     blt.w    HexError
  350.     cmp.b    #'9',d1
  351.     bgt.b    .checkalfa
  352.     sub.b    #'0',d1
  353.     bra.b    .nibbleok
  354.  
  355. .checkalfa    or.b    #$20,d1
  356.     cmp.b    #'a',d1
  357.     blt.w    HexError
  358.     cmp.b    #'f',d1
  359.     bgt.w    HexError
  360.     sub.b    #'a'-10,d1
  361. .nibbleok    asl.l    #4,d0
  362.     or.b    d1,d0
  363.     bra.b    .parsehexaddr
  364.  
  365. .addrend    rts
  366.  
  367. ;---- Allocate Mem (d1 address/d0 - len)
  368. GetMemAllocated    move.l    $4.w,a6
  369.     tst.l    d1
  370.     beq.b    .notabsolute
  371.     move.l    d1,a1
  372.     move.l    d1,d7
  373.     Call    AllocAbs
  374.     tst.l    d0
  375.     bne.b    .AllocationOK
  376.     tst.l    Force(b)
  377.     beq.w    AllocErrorP
  378.     move.l    d7,d0    ;brute force if requested!
  379.     bra.b    .AllocationOK
  380.  
  381. .notabsolute    move.l    d2,d1
  382.     Call    AllocMem
  383.     tst.l    d0
  384.     beq.w    AllocErrorP    ;no force if nice-load
  385.  
  386. .AllocationOK    rts
  387.  
  388. ;---- Read config file if specified
  389. ReadConfig    move.l    #'CFG!',d0    ;scan for Config
  390.     bsr.w    ScanGRID
  391.     bne.b    .foundit
  392.     lea    CFGNotFoundText(pc),a0
  393.     bsr.w    ShowError
  394.     moveq    #0,d0
  395.  
  396. .foundit    move.l    d0,ConfigSpot(b)
  397.  
  398.     move.l    #'KMP!',d0    ;scan for KeyMap
  399.     bsr.w    ScanGRID
  400.     bne.b    .foundit2
  401.     lea    KMPNotFoundText(pc),a0
  402.     bsr.w    ShowError
  403.     moveq    #0,d0
  404.  
  405. .foundit2    move.l    d0,KeyMapSpot(b)
  406.  
  407.     tst.l    ConfigSpot(b)    ;Config SPOT found?
  408.     beq.w    .NoConfigLoad
  409.  
  410.     moveq    #0,d5    ;Load State
  411.  
  412.     move.l    ConfigSpot(b),a0
  413.     move.w    -2-4(a0),ConfigLength(b)
  414. ;    subq.w    #6,ConfigLength(b);length of ID and revision#
  415.     move.w    -4-4(a0),ConfigRevision(b)
  416.  
  417.     lea    ConfigName(pc),a0
  418.     move.l    a0,d1    ;open pref file
  419.     move.l    #MODE_OLDFILE,d2
  420.     CallD    Open
  421.     lea    OpenErrorText2(pc),a0
  422.     move.l    d0,_FileHandle(b)
  423.     beq.b    .ConfigError
  424.  
  425. .fileok    lea    TrashBuffer(b),a0;get ID and revision
  426.     move.l    a0,d2
  427.     moveq    #6,d3
  428.     move.l    _FileHandle(b),d1
  429.     Call    Read
  430.     lea    ReadErrorText2(pc),a0
  431.     cmp.l    #6,d0
  432.     bne.w    .ConfigError
  433.  
  434.     lea    NotGRPrefFileText(pc),a0
  435.     cmp.l    #'GRPF',TrashBuffer(b)
  436.     bne.w    .ConfigError
  437.  
  438.     lea    WrongRevisionText(pc),a0
  439.     move.w    ConfigRevision(b),d0
  440.     cmp.w    TrashBuffer+4(b),d0;correct revision #?
  441.     bne.w    .ConfigError
  442.  
  443.     move.l    ConfigSpot(b),d2
  444.     moveq    #0,d3
  445.     move.w    ConfigLength(b),d3
  446.     move.l    _FileHandle(b),d1
  447.     Call    Read
  448.     move.l    #'USER',d5
  449.     cmp.w    ConfigLength(b),d0
  450.     beq.b    .ConfigOK
  451.     lea    ReadErrorText2(pc),a0
  452.     moveq    #0,d5    ;config fail
  453. .ConfigError    bsr.w    ShowError
  454. .ConfigOK    move.l    _FileHandle(b),d1
  455.     beq.b    .NoConfigLoad
  456.     CallD    Close    ;close file if open
  457.     move.l    ConfigSpot(b),a0
  458.     move.l    d5,-(a0)    ;mark loaded
  459.  
  460.  
  461. .NoConfigLoad    tst.l    KeyMapSpot(b)    ;KeyMap SPOT found?
  462.     beq.b    .NoKeyMapLoad
  463.  
  464.     lea    KeyMapName(pc),a0
  465.     move.l    a0,d1    ;open pref file
  466.     move.l    #MODE_OLDFILE,d2
  467.     CallD    Open
  468.     lea    OpenErrorTextKM(pc),a0
  469.     move.l    d0,_FileHandle(b)
  470.     beq.b    .KeyMapError
  471.  
  472.     move.l    KeyMapSpot(b),d2
  473.     move.l    #96*2,d3
  474.     move.l    _FileHandle(b),d1
  475.     Call    Read
  476.     cmp.l    #96*2,d0
  477.     beq.b    .KeyMapOK
  478.     lea    ReadErrorTextKM2(pc),a0
  479.  
  480. .KeyMapError    bsr.w    ShowError
  481. .KeyMapOK    move.l    _FileHandle(b),d1
  482.     beq.b    .NoKeyMapLoad
  483.     CallD    Close    ;close file if open
  484.  
  485. .NoKeyMapLoad    rts
  486.  
  487. ;---- Scan GR for ID longword
  488. ;- Input:    d0 -    ID
  489. ;- Output:    d0 -    Address/NULL(error)
  490. ;----
  491. ScanGRID    move.l    CodeAddress(b),a0;scan GR for config
  492.     move.l    CodeAddressEnd(b),d1
  493.  
  494. .scan    cmp.l    (a0),d0
  495.     beq.b    .foundID
  496.     addq.l    #2,a0
  497.     cmp.l    a0,d1
  498.     bne.b    .scan
  499.     moveq    #0,d0    ;return error
  500.     rts
  501.  
  502. .foundID    move.l    a0,d0
  503.     addq.l    #4,d0    ;skip ID word
  504.     rts
  505.  
  506.     dc.b    '$VER: GRDR 38'
  507.     VERSTRING
  508.     dc.b    ' © 1993-1994, Jesper Skov.',0
  509.  
  510. Usage    dc.b    UsageLen
  511.     dc.b    'Usage: '
  512. Template    dc.b    'FILENAME,CODE/K,CHIP/K,STATIC/S,FORCE/S,SETNMI/S,COLD/S,QUIET/S',0
  513. UsageLen=*-Usage-1
  514.  
  515. DOSNam    dc.b    'dos.library',0
  516.  
  517. ConfigName    dc.b    'S:GhostRider.Prefs',0
  518. KeyMapName    dc.b    'S:GhostRider.KeyMap',0
  519.  
  520. LineFeed    dc.b    1,10
  521.  
  522. InfoText    dc.b    TL1-1
  523.     dc.b    'GhostRider DeckRunner by Jesper Skov.',10
  524. TL1=*-InfoText
  525.  
  526. OpenErrorText    dc.b    TL2-1
  527.     dc.b    'Could not open GR file!',10
  528. TL2=*-OpenErrorText
  529.  
  530. ReadErrorText    dc.b    TL3-1
  531.     dc.b    'Read error/not expected length!',10
  532. TL3=*-ReadErrorText
  533.  
  534. AllocErrorText    dc.b    TL4-1
  535.     dc.b    'Not enough memory/Could not allocate absolute memory!',10
  536. TL4=*-AllocErrorText
  537.  
  538. NoFileNameText    dc.b    TL5-1
  539.     dc.b    'You must specify a filename!',10
  540. TL5=*-NoFileNameText
  541.  
  542. HexErrorText    dc.b    TL6-1
  543.     dc.b    'Address must be in hexadecimal!',10
  544. TL6=*-HexErrorText
  545.  
  546. CFGNotFoundText    dc.b    TL7-1
  547.     dc.b    'Could not locate preferences in GR!',10
  548. TL7=*-CFGNotFoundText
  549.  
  550. OpenErrorText2    dc.b    TL8-1
  551.     dc.b    'Could not open preference file!',10
  552. TL8=*-OpenErrorText2
  553.  
  554. ReadErrorText2    dc.b    TL9-1
  555.     dc.b    'Preference read error/not expected length!',10
  556. TL9=*-ReadErrorText2
  557.  
  558. NotGRPrefFileText
  559.     dc.b    TL10-1
  560.     dc.b    'Not a GhostRider Preference File!',10
  561. TL10=*-NotGRPrefFileText
  562.  
  563. WrongRevisionText
  564.     dc.b    TL11-1
  565.     dc.b    'Preference File has wrong revision number!',10
  566. TL11=*-WrongRevisionText
  567.  
  568. KMPNotFoundText    dc.b    TL12-1
  569.     dc.b    'Could not locate keymap in GR!',10
  570. TL12=*-KMPNotFoundText
  571.  
  572. OpenErrorTextKM    dc.b    TL13-1
  573.     dc.b    'Could not open keymap file!',10
  574. TL13=*-OpenErrorTextKM
  575.  
  576. ReadErrorTextKM2 dc.b    TL14-1
  577.     dc.b    'KeyMap read error/not expected length!',10
  578. TL14=*-ReadErrorTextKM2
  579.  
  580.  
  581.     section    BSSArea,BSS
  582.  
  583.     rsreset
  584. _DOSBase    rs.l    1
  585. _RDArgs    rs.l    1
  586. _FileHandle    rs.l    1
  587.  
  588. ChipAddress    rs.l    1    ;work address in CHIP
  589. CodeAddress    rs.l    1    ;abs code load address
  590. CodeAddressEnd    rs.l    1
  591. DataAddress    rs.l    1    ;abs data load address
  592. DataAddressEnd    rs.l    1
  593.  
  594. RelocMem    rs.l    1
  595. RelocLen    rs.l    1
  596.  
  597. GRIPBase    rs.l    1
  598.  
  599. ArgArray    rs.b    0
  600. FileName    rs.l    1
  601. AbsAddr    rs.l    1
  602. ChipAddr    rs.l    1
  603. Static    rs.l    1
  604. Force    rs.l    1
  605. SetNMI    rs.l    1
  606. Cold    rs.l    1
  607. Quiet    rs.l    1
  608.  
  609. TrashBuffer    rs.l    8
  610.  
  611. ConfigLength    rs.w    1
  612. ConfigRevision    rs.w    1
  613. ConfigSpot    rs.l    1
  614. KeyMapSpot    rs.l    1
  615.  
  616. Error    rs.b    1
  617. FindRST    rs.b    1
  618.  
  619. BSSSize    rs.b    0
  620. B    ds.b    BSSSize
  621.